package com.he.hsdyc.designmodule.single;

/**
 * 功能描述: 单例模式-----懒汉模式（线程安全但是效率会有影响,推荐DCL）
 * @date: 2019/8/6
 */
public class OrderLazy {

    public static OrderLazy orderLazy;

    private OrderLazy() {};


    //写法有问题，一直new对象肯定不是单例的
//    public static OrderLazy getInstance() {
//        if(null == orderLazy) {
//            return new OrderLazy();
//        }
//        else return orderLazy;
//    }


    //--------加锁，线程安全但是效率会有影响
//    public static synchronized OrderLazy getInstance() {
//        if (null == orderLazy) {
//            orderLazy = new OrderLazy();
//        }
//        return orderLazy;
//    }

    //DCL双重检查锁的机制，第一个判断排除了已经有实例的情况，但是多线程环境下
    //若当前没有OrderLazy实例，则可能有多个线程进入第一个if判断
    //此时加锁，第一个线程进入会创建OrderLazy实例，但是一同进来的第一层if条件下的
    //其他线程也会创建新的实例，所以才会有第二层if，保证只有一个线程创建了OrderLazy实例
    public static OrderLazy getInstance() {//----------------多线程环境下的懒汉单例模式推荐
        if(null == orderLazy) {
            synchronized (OrderLazy.class) {
                if(null == orderLazy) {
                    orderLazy = new OrderLazy();
                }
            }
        }
        return orderLazy;
    }
}
